#include <linux/mm.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/mempool.h>

static int __init mempoolalloc_initfunc(void);
static void __exit mempoolalloc_exitfunc(void);

static struct kmem_cache *pkmem = NULL;

static mempool_t *pmp = NULL;

static void *pobj = NULL;

static int __init mempoolalloc_initfunc(void)
{
    pkmem = kmem_cache_create("myslabbuffer", 500000, 0, SLAB_HWCACHE_ALIGN, NULL);
    if (NULL == pkmem)
    {
        printk("调用kmem_cache_create(...)函数创建slab缓存失败\n");
        return 0;
    }
    
    printk("调用kmem_cache_create(...)函数创建slab缓存成功\n");


    pmp = mempool_create(10, mempool_alloc_slab, mempool_free_slab, pkmem);
    if (NULL == pmp)
    {
        printk("调用mempool_create函数创建内存池失败！\n");
        return 0;
    }
    
    printk("调用mempool_create函数创建内存池成功！\n");
    pobj = mempool_alloc(pmp, GFP_KERNEL);
    printk("调用mempool_alloc函数分配内存对象成功，对应地址为：0x%lx\n", (unsigned long) pobj);

    return 0;
}

static void __exit mempoolalloc_exitfunc(void)
{
    if (pobj != NULL)
    {
        mempool_free(pobj, pmp);
        printk("调用mempool_free函数释放内存对象成功！\n");
    }

    if (pmp != NULL)
    {
        mempool_destroy(pmp); // 释放内存池
        printk("调用mempool_destroy释放内存池成功\n");
    }
    
    if (NULL != pkmem)
    {
        kmem_cache_destroy(pkmem); // 释放slab缓存
        printk("调用kmem_cache_destroy函数释放slab缓存成功\n");
    }
    
    printk("");
}

MODULE_LICENSE("GPL");

module_init(mempoolalloc_initfunc);
module_exit(mempoolalloc_exitfunc)